index.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { Plus } from 'lucide-react'
  2. import { useState } from 'react'
  3. import { Button } from 'ui'
  4. import { PageContainer } from 'ui-patterns/PageContainer'
  5. import {
  6. PageHeader,
  7. PageHeaderDescription,
  8. PageHeaderMeta,
  9. PageHeaderSummary,
  10. PageHeaderTitle,
  11. } from 'ui-patterns/PageHeader'
  12. import {
  13. PageSection,
  14. PageSectionAside,
  15. PageSectionContent,
  16. PageSectionDescription,
  17. PageSectionMeta,
  18. PageSectionSummary,
  19. PageSectionTitle,
  20. } from 'ui-patterns/PageSection'
  21. import { AppsList } from '@/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsList'
  22. import { CreateAppSheet } from '@/components/interfaces/Organization/PrivateApps/Apps/CreateAppSheet/CreateAppSheet'
  23. import {
  24. PrivateAppsProvider,
  25. usePrivateApps,
  26. } from '@/components/interfaces/Organization/PrivateApps/PrivateAppsContext'
  27. import { DefaultLayout } from '@/components/layouts/DefaultLayout'
  28. import OrganizationLayout from '@/components/layouts/OrganizationLayout'
  29. import { OrganizationSettingsLayout } from '@/components/layouts/ProjectLayout/OrganizationSettingsLayout'
  30. import type { NextPageWithLayout } from '@/types'
  31. function PrivateAppsContent() {
  32. const { apps, isLoading } = usePrivateApps()
  33. const [showCreate, setShowCreate] = useState(false)
  34. return (
  35. <>
  36. <PageHeader size="default">
  37. <PageHeaderMeta>
  38. <PageHeaderSummary>
  39. <PageHeaderTitle>Private Apps</PageHeaderTitle>
  40. <PageHeaderDescription>
  41. Create private apps to generate scoped access tokens for your organization
  42. </PageHeaderDescription>
  43. </PageHeaderSummary>
  44. </PageHeaderMeta>
  45. </PageHeader>
  46. <PageContainer size="default" className="pb-16">
  47. <PageSection id="apps">
  48. <PageSectionMeta>
  49. <PageSectionSummary>
  50. <PageSectionTitle>Apps</PageSectionTitle>
  51. <PageSectionDescription>
  52. Registered private apps and their credentials
  53. </PageSectionDescription>
  54. </PageSectionSummary>
  55. {!isLoading && apps.length > 0 && (
  56. <PageSectionAside>
  57. <Button
  58. type="primary"
  59. icon={<Plus size={14} />}
  60. onClick={() => setShowCreate(true)}
  61. >
  62. Create app
  63. </Button>
  64. </PageSectionAside>
  65. )}
  66. </PageSectionMeta>
  67. <PageSectionContent>
  68. <AppsList onCreateApp={() => setShowCreate(true)} />
  69. </PageSectionContent>
  70. </PageSection>
  71. </PageContainer>
  72. <CreateAppSheet
  73. visible={showCreate}
  74. onClose={() => setShowCreate(false)}
  75. onCreated={() => setShowCreate(false)}
  76. />
  77. </>
  78. )
  79. }
  80. const PrivateAppsPage: NextPageWithLayout = () => {
  81. return <PrivateAppsContent />
  82. }
  83. PrivateAppsPage.getLayout = (page) => (
  84. <DefaultLayout>
  85. <OrganizationLayout title="Private Apps">
  86. <OrganizationSettingsLayout>
  87. <PrivateAppsProvider>{page}</PrivateAppsProvider>
  88. </OrganizationSettingsLayout>
  89. </OrganizationLayout>
  90. </DefaultLayout>
  91. )
  92. export default PrivateAppsPage